package br.com.locadoracom.managedBeam;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import br.com.locadoracom.dao.FilmeDao;
import br.com.locadoracom.dao.MidiaDao;
import br.com.locadoracom.model.EstadoMidia;
import br.com.locadoracom.model.Filme;
import br.com.locadoracom.model.GeneroFilme;
import br.com.locadoracom.model.ItemFilme;
import br.com.locadoracom.model.Midia;
import br.com.locadoracom.model.Pais;
import br.com.locadoracom.model.ParticipanteFilme;

@ManagedBean
@ViewScoped
public class EditAcervoMB implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private Filme filme = new Filme();
	private Pais pais = new Pais();
	public List<Pais> paises;
	private ParticipanteFilme participante = new ParticipanteFilme();
	private ParticipanteFilme diretor = new ParticipanteFilme();
	private Midia midia = new Midia();
	private List<SelectItem> midias;
	private ItemFilme itemFilme = new ItemFilme();
	private GeneroFilme genero;
	private GeneroFilme[] generos;
	private EstadoMidia estado;
	private EstadoMidia[] estados;
	private List<ParticipanteFilme> elenco = new ArrayList<ParticipanteFilme>();
	private List<ItemFilme> itensFilme;
	private String tituloOrig = "";	
	private FilmeDao filmeDao;
	
	public EditAcervoMB() {
		FacesContext fc = FacesContext.getCurrentInstance();
		if (fc.getExternalContext().getSessionMap().containsKey("idNovoFilme")) {			
			filme = (Filme) fc.getExternalContext().getSessionMap().get("idNovoFilme");
			fc.getExternalContext().getSessionMap().remove("idNovoFilme");
			genero = filme.getGenero();
		} else {
			filme = new Filme();
			pais = new Pais();
			participante = new ParticipanteFilme();
			diretor = new ParticipanteFilme();
			midia = new Midia();
			itemFilme = new ItemFilme();
		}
	}	
	public List<SelectItem> getMidias() {
		try{
			midias = new ArrayList<SelectItem>();
			MidiaDao midiaDao = new MidiaDao();
			for (Midia m: midiaDao.findByAll()){
				midias.add(new SelectItem(m.getId(), m.getTipoMidia()+" - "+m.getValorPadrao()));
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return midias;
	}
	public void setMidias(List<SelectItem> midias) {
		this.midias = midias;
	}
	public EstadoMidia getEstado() {
		return estado;
	}
	public void setEstado(EstadoMidia estado) {
		this.estado = estado;
	}
	public EstadoMidia[] getEstados() {
		estados = EstadoMidia.values();
		return estados;
	}
	public void setEstados(EstadoMidia[] estados) {
		this.estados = estados;
	}
	public List<Pais> getPaises() {
		paises = new ArrayList<Pais>(); 
		paises = filme.getPaises();
		return paises;
	}
	public String getTituloOrig() {
		return tituloOrig;
	}
	public void setTituloOrig(String tituloOrig) {
		this.tituloOrig = tituloOrig;
	}
	public void setPaises(List<Pais> paises) {
		this.paises = paises;
	}
	public GeneroFilme[] getGeneros() {
		generos = GeneroFilme.values();
		return generos;
	}
	public void setGeneros(GeneroFilme[] generos) {
		this.generos = generos;
	}
	public List<ItemFilme> getItensFilme() {
		itensFilme = new ArrayList<ItemFilme>(); 
		itensFilme = filme.getItens();
		return itensFilme;
	}
	public void setItensFilme(List<ItemFilme> itensFilme) {
		this.itensFilme = itensFilme;
	}
	public GeneroFilme getGenero() {
		genero = filme.getGenero();
		return genero;
	}
	public void setGenero(GeneroFilme genero) {
		this.genero = genero;
	}
	public Filme getFilme() {
		return filme;
	}
	public void setFilme(Filme filme) {
		this.filme = filme;
	}
	public Pais getPais() {
		return pais;
	}
	public void setPais(Pais pais) {
		this.pais = pais;
	}
	public ParticipanteFilme getDiretor() {
		return diretor;
	}
	public ParticipanteFilme getParticipante() {
		return participante;
	}
	public void setParticipante(ParticipanteFilme participante) {
		this.participante = participante;
	}
	public List<ParticipanteFilme> getElenco() {
		elenco = filme.getElenco();
		return elenco;
	}
	public void setElenco(List<ParticipanteFilme> elenco) {
		this.elenco = elenco;
	}
	public void setDiretor(ParticipanteFilme diretor) {
		this.diretor = diretor;
	}
	public Midia getMidia() {
		return midia;
	}
	public void setMidia(Midia midia) {
		this.midia = midia;
	}
	public ItemFilme getItemFilme() {
		return itemFilme;
	}
	public void setItemFilme(ItemFilme itemFilme) {
		this.midia = itemFilme.getMidia();
		this.itemFilme = itemFilme;
	}
	public String adicionarPais(){
		FacesContext fc = FacesContext.getCurrentInstance();
		filmeDao = new FilmeDao();
		if (filme.getPaises().contains(pais)) {
			filme = filmeDao.merge(filme);
			pais = new Pais();
			fc.addMessage(null, new FacesMessage("Pais atualizado com sucesso!"));
			return null;
		}
		filme.getPaises().add(pais);
		filme = filmeDao.merge(filme);
		
		pais = new Pais();
		return null;
	}
	
	public void excluirPais() {
		FacesContext fc = FacesContext.getCurrentInstance();
		filmeDao = new FilmeDao();
		filme.getPaises().remove(pais);
		filme = filmeDao.merge(filme);
		pais = new Pais();
		fc.addMessage(null, new FacesMessage("Pais excluido com sucesso!"));
	}
	
	public String adicionarParticipante(){
		FacesContext fc = FacesContext.getCurrentInstance();
		filmeDao = new FilmeDao();
		if (filme.getElenco().contains(participante)) {
			filme = filmeDao.merge(filme);
			participante = new ParticipanteFilme();
			fc.addMessage(null, new FacesMessage("Participante atualizado com sucesso!"));
			return null;
		}
		filme.getElenco().add(participante);
		filme = filmeDao.merge(filme);
		
		participante = new ParticipanteFilme();
		return null;
	}
	
	public void excluirParticipante() {
		FacesContext fc = FacesContext.getCurrentInstance();
		filmeDao = new FilmeDao();
		filme.getElenco().remove(participante);
		filme = filmeDao.merge(filme);
		participante = new ParticipanteFilme();
		fc.addMessage(null, new FacesMessage("Participante excluido com sucesso!"));
	}
	
	public String adicionarItemFilme(){
		FacesContext fc = FacesContext.getCurrentInstance();
		filmeDao = new FilmeDao();
		if (filme.getItens().contains(itemFilme)){
			itemFilme.setEstado(estado);
			itemFilme.setMidia(midia);
			filme = filmeDao.merge(filme);
			itemFilme = new ItemFilme();
			fc.addMessage(null, new FacesMessage("Item de Filme atualizado com sucesso!"));
			return null;
		}
		itemFilme.setFilme(filme);
		itemFilme.setEstado(estado);
		itemFilme.setMidia(midia);
		filme.getItens().add(itemFilme);
		
		filme = filmeDao.merge(filme);
		
		midia = new Midia();
		itemFilme = new ItemFilme();
		return null;
	}
	
	public void excluirItemFilme() {
		FacesContext fc = FacesContext.getCurrentInstance();
		filmeDao = new FilmeDao();
		filme.getItens().remove(itemFilme);
		filme = filmeDao.merge(filme);
		itemFilme = new ItemFilme();
		fc.addMessage(null, new FacesMessage("Item de Filme excluido com sucesso!"));
	}
	
	public void salvarEditar() {
		FacesContext fc = FacesContext.getCurrentInstance();
		filmeDao = new FilmeDao();
		
		filme.setGenero(genero);
		if (diretor!=null) {
			ParticipanteFilme acheiDiretor = 
					filmeDao.procurarParticipantePorNomeNascimento(
							diretor.getNome(), 
							diretor.getNascimento());
			if (acheiDiretor!=null)
				diretor = acheiDiretor;
				
			filme.setDiretor(diretor);
		}
		filme = filmeDao.merge(filme);
			
		fc.addMessage(null , new FacesMessage("Filme atualizado."));
		fc.getExternalContext().getSessionMap().put("idNovoFilme", filme);
	}
	
	public void buscarPorTitulo() {
		FacesContext fc = FacesContext.getCurrentInstance();
		filmeDao = new FilmeDao();
		
		filme = filmeDao.procurarPorTituloOriginal(tituloOrig);
		if (filme == null) {
			fc.addMessage(null, new FacesMessage("Filme nao encontrado."));	
			filme = new Filme();
		} else {
			if (filme.getDiretor()!=null)
				diretor = filme.getDiretor();
				elenco = filme.getElenco();
				genero = filme.getGenero();
			fc.addMessage(null, new FacesMessage("Filme encontrado."));
		}
	}
	
}